use shapefile::{Shape, Reader};
use std::error::Error;
use std::path::Path;
use std::env;

fn main() -> Result<(), Box<dyn Error>> {
    // 获取文件路径（命令行参数或默认值）
    let shapefile_path = if env::args().count() > 1 {
        env::args().nth(1).unwrap()
    } else {
        "E:/文件/shapefile/china_SHP/省界_Project.shp".to_string()
    };

    // 验证文件存在性
    if !Path::new(&shapefile_path).exists() {
        return Err(format!("Shapefile {} 不存在", shapefile_path).into());
    }

    println!("正在读取: {}", shapefile_path);

    // 创建 Reader 并获取迭代器
    let mut reader = Reader::from_path(&shapefile_path)?;
    let mut record_count = 0;

    // 正确迭代方法
    for result in reader.iter_shapes_and_records() {
        let (shape, record) = result?;
        record_count += 1;

        // 处理几何图形（使用公共方法访问）
        match shape {
            Shape::Point(point) => {
                println!("记录 {}: 点坐标 ({}, {})", record_count, point.x, point.y);
            }
            Shape::Polyline(polyline) => {
                // 使用公共方法获取部分数量
                println!("记录 {}: 多段线 ({}部分)", record_count, polyline.parts().len());
            }
            Shape::Polygon(polygon) => {
                // 使用公共方法获取部分数量
                println!("记录 {}: 多边形 ({}环)", record_count, polygon.rings().len());
            }
            Shape::Multipoint(multipoint) => {
                println!("记录 {}: 多点集合 ({}点)", record_count, multipoint.points().len());
            }
            Shape::NullShape => println!("记录 {}: 空几何图形", record_count),
            _ => println!("记录 {}: 未处理的几何类型", record_count),
        }

        // 处理属性数据
        for (field_name, field_value) in record {
            println!("属性 {}: {:?}", field_name, field_value);
        }
    }

    println!("成功处理 {} 条记录", record_count);
    Ok(())
}